package ProducerAndConsumer;

/**
 * 用synchronized实现生产者消费者模式
 * 用两个线程实现1到10数字的交替打印
 */
public class ProducerAndConsumer01 {

    public static void main(String[] args) {
        Task task = new Task();

        // 创建打印偶数的线程A
        new Thread(() -> {
            try {
                for (int i = 0; i < 5; i++) {
                    task.evenNumber();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "A").start();

        // 创建打印奇数的线程B
        new Thread(() -> {
            try {
                for (int i = 0; i < 5; i++) {
                    task.oddNumber();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "B").start();
    }
}

class Task {

    private int num = 0;

    /**
     * 打印奇数
     */
    public synchronized void oddNumber() throws InterruptedException {
        // 等待条件，注意这里使用的是while条件哦
        while (num % 2 == 0) {
            this.wait();
        }

        // 执行业务，数字 + 1并打印
        System.out.println(Thread.currentThread().getName() + " -> " + num++);

        // 唤醒打印偶数的线程
        this.notifyAll();
    }

    /**
     * 打印偶数
     */
    public synchronized void evenNumber() throws InterruptedException {
        // 等待条件
        while (num % 2 == 1) {
            this.wait();
        }

        // 执行业务，数字 + 1并打印
        System.out.println(Thread.currentThread().getName() + " -> " + num++);

        // 唤醒打印奇数的线程
        this.notifyAll();
    }
}